import { EventBus } from "@/utils/EventBus";
import { Toast } from "antd-mobile";
import axios from "axios";

const request = axios.create({
  // 将来上线可能分两种情况，
  // 情况1： 上线服务器和数据服务器是同一台，打包后的静态是作为当前这台数据服务器的静态存在的
  // 这种情况的处理，只需要把 /api 删除，留下 / ，或者把 /api --> 服务器的ip+端口
  // baseURL: "/api",
  // baseURL: process.env.NODE_ENV == 'development' ? '/api' : 'https://www.ahsj.link/rambo',
  // 当然也可以在 start.js 和 build.js 里面直接配置 服务器地址
  // baseURL: process.env.NODE_SERVER,
  timeout: 5000,

  // 情况2： 上线服务器和数据服务器不是同一台
  // 做法1： 数据服务器，开放跨域权限 (配置响应头)
  // 做法2： 让上线服务器做代理 - nginx - 也是一个配置文件
  // 如果要使用 上线服务器 来代理，先把 baseURL 写成 /api
  baseURL: "/api",
});

request.interceptors.request.use(
  (config) => {
    // 当前的项目是 除了少数几个接口，都是要带token的
    // 所以我们统一在拦截器里面携带
    let token = localStorage.getItem('token')
    if (token) {
      config.headers['x-auth-token'] = token;
    }
    return config;
  },
  (err) => Promise.reject(err)
);
request.interceptors.response.use(
  (res) => {
    // 进入该函数 ， 证明 请求是成功的 ，响应状态码是 200
    return res.data;
  },
  (err) => {
    // console.log(err)
    // 如果进入这个函数 ，证明请求是失败的
    // 该项目里面的 接口不够标准， 但凡是 业务不成功， 返回的响应状态码， 就是 非 200
    // 统一进行错误提示
    Toast.show({
      icon: 'fail',
      content: err.response.data.message
    })
    // Promise.reject(err)
    // 目标： 判断是否已经登录失效，如果失效，需要跳转到login页面，强制用户登录
    // errCode === 1002 ， 就是登录失效
    if (err.response.data.errCode === 1002) {
      // 清空旧数据
      // a. 本地缓存
      localStorage.clear();
      sessionStorage.clear();
      // b. redux
      // 在分仓库里面写清空仓库的方法，一个一个依次调用
      // 跳转到login
      // ? 现在这里不是hook，也不是函数组件 ， 如何调用 navigate 这个hook 进行跳转？
      // 现在一定要跳转，跳转一定要使用 useNavigate ,但是这里不是能调用hook的环境 --- 紧耦合
      // 设计模式中 有一种模式 - 订阅发布模式，专门用来解耦的
      // 已经在App里面订阅好了，直接在这里使用 emit 触发
      EventBus.emit('logintimeout')
    }
  }
);

export default request;